[CODE BLUE 2017]SSRFの新時代 – 有名プログラミング言語内のURLパーサーを攻撃! オレンジ・サイ – Orange Tsai -[レポート] #codeblue_jp #codeblue_jp_t2
こんにちは、臼田です。
『世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議』でありますCODE BLUE 2017に参加していますのでレポートします。
このブログは下記セッションについてのレポートです。
SSRFの新時代 - 有名プログラミング言語内のURLパーサーを攻撃! - オレンジ・サイ - Orange Tsai -
レポート
- SSRFはWebアプリケーションに対する攻撃の概念
- 10年前ぐらいにみつかっている
- SSRFは今でも大手サイトであってもよく見られる
- Orange氏はDEVCOREで脆弱性の研究等を行っている
- HITCONのメンバー
SSRFとは
- Server Side Request Forgery
- Firewallを回避してイントラネットに触れることが出来る
- 大企業にはStruts2等があるがこれらを乗っ取ることができる
SSRFを仕込む
- PythonのライブラリによってアクセスするURLの解釈が異なる場合がある
- SMTPはHTTPを嫌っている
- Gopher is good
- CR-LF injection on HTTPS
- Smuggling SMTP over TLS SNI
- ホスト名をいじることによりドメイン名に不正なコードを注入できる
- glibcに起因する動作
SSRFを偉大にする
- URL Parsing Issues
- パーサとリクエストの間の不一致を狙う
- バリデーションは大変
- RFC2396とRFC3986があるがSPECのみ、実装がない
- Componentsで定義されているauthority/pathについて取り上げる
- 「:」はセパレータだがhttp://127.0.0.1:11211:80/のようにするとPHP parse_urlは11211をポートと取り上げる
- curlは@がある場合に手前の文字列を捉えてしまう
- curlは他の場所でも利用されているので範囲が広い
- NodeJS Unicode Failure
- UnicodeのNNを利用する
- http://example/NN/passwd
- \xFF\x2E\xFF\x2Eとなり\xFFが消されるので「..」と解釈される
- passwdにアクセスできてしまう
- U+FF0D U+FF0Aを利用するとCR-LF injection出来てしまう
- glibc NSS Features
- RFC1035のgethostbyname()
- バックスラッシュを利用する
- Linux getaddrinfo()
- CR-LFをドメイン名手前に挿入すると、それより前のみ評価される
- http://127.0.0.1\r\nfooは127.0.0.1にアクセスする
- Exploit Glibc NSS features on Protocol Sumgling
- HTTP 1.1はホスト名headerが必要
- ホスト名にhttp://127.0.0.1\r\n SLAVEOF orange.tw\r\n :6379のような感じでヘッダにインジェクションできる
- CVE-2016-5699
- HTTPConnection.putheadder
- Redisとmemchachdにより攻撃が成立する
- RFC1035のgethostbyname()
- IDNA
- IDNA2003、2008がある
- 2003は丸文字がASCIIとして解釈されていた
- IDNAのどれを利用しているかも重要
Case Study
- MyBB
- gethostbyname()でDNS結果を127.0.0.1でキャッシュさせる
- http://β.orange.twとかやる
- curl等に対するスペースインジェクションとかで127.0.0.1を引かせることができる
- GitHub Enterprise
- 記事
- 4つの攻撃を組み合わせてremote code executionできる
- $12,500の報酬がでた
どのようにSSRFを予防するか
- IPかホスト名ど甍のみを利用する
- Firewall
- 開発したツールはこちら
- https://github.com/orangetw/Tiny-URL-Fuzzer
感想
攻撃手法のとっかかりとしてSSRFが有効であることがよくわかりました。
URLの処理については定義されていないことが多く難しい問題であると思いますが、気をつけたいですね。